// package语句：声明当前类所在的包
// com.itheima.type表示这是一个类型演示相关的类
package com.itheima.type;

// public是访问修饰符，表示这个类可以被任何地方访问
// class关键字用于定义一个类
// TypeDemo2是类名，用于演示Java中的表达式类型提升
public class TypeDemo2 {
    // main方法：Java程序的入口点
    // public static void是固定格式
    // String[] args是命令行参数数组
    public static void main(String[] args) {
        // 注释：说明这个程序的目标是理解表达式的自动类型提升
        
        // 调用calc2方法，传入两个byte类型的参数（通过强制类型转换）
        // 110和120作为字面量，默认是int类型，所以需要强制转换为byte
        // 将方法返回值赋给int类型的变量result
        int result = calc2((byte) 110, (byte) 120);
        
        // 打印result的值，结果应该是230
        System.out.println(result);

        // 调用calc3方法，同样传入两个byte类型的参数
        // 将方法返回值赋给int类型的变量result2
        int result2 = calc3((byte) 110, (byte) 120);
        
        // 打印result2的值，由于110+120=230超出byte范围，会发生溢出
        // 结果应该是-26（因为230-256=-26）
        System.out.println(result2);
    }

    // 注释：这个方法用于演示不同类型数据混合运算时的类型提升
    // 定义calc方法，接收四个不同类型的参数
    // 参数：int a, int b, double c, char r
    // 返回值：double类型
    public static double calc(int a, int b, double c, char r) {
        // 注释：解释表达式中的类型提升规则
        // 在混合类型运算中，结果类型由参与运算的最高精度类型决定
        // int + int + double + char → 最终结果是double类型
        // char类型r在运算时会自动转换为int（对应的ASCII码值）
        return a + b + c + r;
    }

    // 定义calc2方法，接收两个byte类型的参数
    // 返回值：int类型
    public static int calc2(byte a, byte b) {
        // 注释：解释byte类型运算时的自动提升规则
        // byte、short、char类型在进行运算时，会自动提升为int类型
        // 所以a + b的结果实际上是int类型
        // 方法返回int类型，符合结果类型
        return a + b;
    }

    // 定义calc3方法，接收两个byte类型的参数
    // 返回值：byte类型
    public static byte calc3(byte a, byte b) {
        // 先计算a + b（结果是int类型），然后强制转换为byte类型
        // 注意：如果结果超出byte范围（-128到127），会发生数据溢出
        // 这里(a + b)的括号很重要，确保先完成加法运算再进行类型转换
        byte c = (byte) (a + b);
        
        // 返回byte类型的结果
        return c;
    }
}
